﻿using System;
using System.Collections.Generic;
using System.Text;
using Estimate.Common.Entity;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using Estimate.Common.DBFieldTypes;

namespace Estimate.Common.Repository
{
    public class RealStationCompareRepository : BaseRepository
    {
        public RealStationCompareRepository(string connectionString)
            : base(connectionString, "RealStationCompare")
        { }


        public override string GetCreateTableSql()
        {
            string sqlcreate = String.Format("CREATE TABLE [{0}](id bigint identity(1,1), name varchar(10), fore char(5) ,real char(5),type varchar(15)) \n", _tableName);
            sqlcreate += String.Format("CREATE CLUSTERED INDEX {0}_INDEX ON {0} (name,type,fore,real) \n", _tableName, _tableName);
            sqlcreate += String.Format("alter table {0} add primary key (id)", _tableName);
            return sqlcreate;
        }

        public override void AfterCreateTable()
        {
            string items = "丰县;58012;58012|沛县;58013;58013|邳州;58026;58026|徐州;58027;58027|新沂;58035;58035|东海;58036;58036|沭阳;58038;58038|赣榆;58040;58040|连云港;58044;58044|响水;58045;58045|灌云;58047;58047|灌南;58048;58048|滨海;58049;58049|睢宁;58130;58130|宿迁;58131;58131|泗阳;58132;58132|泗洪;58135;58135|盱眙;58138;58138|洪泽;58139;58139|涟水;58140;58140|淮安;58141;58141|阜宁;58143;58143|楚州;58145;58145|建湖;58146;58146|金湖;58147;58147|宝应;58148;58148|射阳;58150;58150|盐城;58151;58154|大丰;58158;58158|六合;58235;58235|江浦;58237;58237|南京;58238;58238|高邮;58241;58241|仪征;58242;58242|兴化;58243;58243|江都;58244;58244|扬州;58245;58245|泰州;58246;58246|扬中;58247;58247|镇江;58248;58252|泰兴;58249;58249|姜堰;58250;58250|东台;58251;58251|海安;58254;58254|如皋;58255;58255|靖江;58257;58257|南通;58259;58259|如东;58264;58264|通州;58268;58268|启东;58269;58269|江宁;58333;58238|高淳;58339;58339|溧水;58340;58340|丹阳;58341;58341|金坛;58342;58342|常州;58343;58343|句容;58344;58344|溧阳;58345;58345|宜兴;58346;58346|江阴;58351;58351|常熟;58352;58352|张家港;58353;58353|无锡;58354;58354|昆山;58356;58356|苏州;58357;58357|吴江;58359;58359|海门;58360;58360|太仓;58377;58377;";
            string pattern = @"\|";
            string pattern2 = @"\;";
            List<string> sites = new List<string>();
            foreach (string item in Regex.Split(items, pattern))
            {
                string[] sts = Regex.Split(item, pattern2);
                InsertRecord(sts[0],RealStationCompareType.Normal_Auto.ToString() , sts[1], sts[2]);
            }

            items = "丰县;58012;58012|沛县;58013;58013|邳州;58026;58026|徐州;58027;58027|新沂;58035;58035|东海;58036;58036|沭阳;58038;58038|赣榆;58040;58040|连云港;58044;58044|响水;58045;58045|灌云;58047;58047|灌南;58048;58048|滨海;58049;58049|睢宁;58130;58130|宿迁;58131;58131|泗阳;58132;58132|泗洪;58135;58135|盱眙;58138;58138|洪泽;58139;58139|涟水;58140;58140|淮安;58141;58141|阜宁;58143;58143|楚州;58145;58145|建湖;58146;58146|金湖;58147;58147|宝应;58148;58148|射阳;58150;58150|盐城;58151;58154|大丰;58158;58158|六合;58235;58235|江浦;58237;58237|南京;58238;58238|高邮;58241;58241|仪征;58242;58242|兴化;58243;58243|江都;58244;58244|扬州;58245;58245|泰州;58246;58246|扬中;58247;58247|镇江;58248;58252|泰兴;58249;58249|姜堰;58250;58250|东台;58251;58251|海安;58254;58254|如皋;58255;58255|靖江;58257;58257|南通;58259;58259|如东;58264;58264|通州;58268;58268|启东;58269;58269|江宁;58333;58238|高淳;58339;58339|溧水;58340;58340|丹阳;58341;58341|金坛;58342;58342|常州;58343;58343|句容;58344;58344|溧阳;58345;58345|宜兴;58346;58346|江阴;58351;58351|常熟;58352;58352|张家港;58353;58353|无锡;58354;58354|昆山;58356;58356|苏州;58357;58357|吴江;58359;58359|海门;58360;58360|太仓;58377;58377;";
            sites = new List<string>();
            foreach (string item in Regex.Split(items, pattern))
            {
                string[] sts = Regex.Split(item, pattern2);
                InsertRecord(sts[0],RealStationCompareType.Normal_Manual.ToString(), sts[1], sts[2]);
            }

            items = "丰县;58012;58012|沛县;58013;58013|邳州;58026;58026|徐州;58027;58027|新沂;58035;58035|东海;58036;58036|沭阳;58038;58038|赣榆;58040;58040|连云港;58044;58044|响水;58045;58045|灌云;58047;58047|灌南;58048;58048|滨海;58049;58049|睢宁;58130;58130|宿迁;58131;58131|泗阳;58132;58132|泗洪;58135;58135|盱眙;58138;58138|洪泽;58139;58139|涟水;58140;58140|淮安;58141;58141|阜宁;58143;58143|楚州;58145;58145|建湖;58146;58146|金湖;58147;58147|宝应;58148;58148|射阳;58150;58150|盐城;58154;58154|大丰;58158;58158|六合;58235;58235|江浦;58237;58237|南京;58238;58238|高邮;58241;58241|仪征;58242;58242|兴化;58243;58243|江都;58244;58244|扬州;58245;58245|泰州;58246;58246|扬中;58247;58247|镇江;58252;58252|泰兴;58249;58249|姜堰;58250;58250|东台;58251;58251|海安;58254;58254|如皋;58255;58255|靖江;58257;58257|南通;58259;58259|如东;58264;58264|吕泗;58265;58265|通州;58268;58268|启东;58269;58269|江宁;58333;58238|高淳;58339;58339|溧水;58340;58340|丹阳;58341;58341|金坛;58342;58342|常州;58343;58343|句容;58344;58344|溧阳;58345;58345|宜兴;58346;58346|江阴;58351;58351|常熟;58352;58352|张家港;58353;58353|无锡;58354;58354|昆山;58356;58356|苏州;58357;58357|东山;58358;58358|吴江;58359;58359|海门;58360;58360|太仓;58377;58377;";
           sites = new List<string>();
            foreach (string item in Regex.Split(items, pattern))
            {
                string[] sts = Regex.Split(item, pattern2);
                InsertRecord(sts[0], RealStationCompareType.Site_Auto.ToString(), sts[1], sts[2]);
            }

            items = "丰县;58012;58012|沛县;58013;58013|邳州;58026;58026|徐州;58027;58027|新沂;58035;58035|东海;58036;58036|沭阳;58038;58038|赣榆;58040;58040|连云港;58044;58044|响水;58045;58045|灌云;58047;58047|灌南;58048;58048|滨海;58049;58049|睢宁;58130;58130|宿迁;58131;58131|泗阳;58132;58132|泗洪;58135;58135|盱眙;58138;58138|洪泽;58139;58139|涟水;58140;58140|淮安;58141;58141|阜宁;58143;58143|楚州;58145;58145|建湖;58146;58146|金湖;58147;58147|宝应;58148;58148|射阳;58150;58150|盐城;58154;58151|大丰;58158;58158|六合;58235;58235|江浦;58237;58237|南京;58238;58238|高邮;58241;58241|仪征;58242;58242|兴化;58243;58243|江都;58244;58244|扬州;58245;58245|泰州;58246;58246|扬中;58247;58247|镇江;58252;58248|泰兴;58249;58249|姜堰;58250;58250|东台;58251;58251|海安;58254;58254|如皋;58255;58255|靖江;58257;58257|南通;58259;58259|如东;58264;58264|吕泗;58265;58265|通州;58268;58268|启东;58269;58269|江宁;58333;58238|高淳;58339;58339|溧水;58340;58340|丹阳;58341;58341|金坛;58342;58342|常州;58343;58343|句容;58344;58344|溧阳;58345;58345|宜兴;58346;58346|江阴;58351;58351|常熟;58352;58352|张家港;58353;58353|无锡;58354;58354|昆山;58356;58356|苏州;58357;58357|东山;58358;58358|吴江;58359;58359|海门;58360;58360|太仓;58377;58377;";
            sites = new List<string>();
            foreach (string item in Regex.Split(items, pattern))
            {
                string[] sts = Regex.Split(item, pattern2);
                InsertRecord(sts[0], RealStationCompareType.Site_Manual.ToString(), sts[1], sts[2]);
            }
            
        }

        /// <summary>
        /// 向数据库中添加新的记录
        /// </summary>
        /// <param name="name">站点名称</param>
        /// <param name="foreStation">预报站站号</param>
        /// <param name="realStation">实况站站号</param>
        public void InsertRecord(string name, string type, string foreStation, string realStation)
        {
            string sql = String.Format("INSERT INTO [{0}] (name,type,fore,real) values(@name,@type,@fore,@real)", _tableName);
            SqlParameter[] param = new SqlParameter[4];
            param[0] = new SqlParameter("@name", name);
            param[1] = new SqlParameter("@type", type);
            param[2] = new SqlParameter("@fore", foreStation);
            param[3] = new SqlParameter("@real", realStation);
            DBHelper.ExecuteSql(_connectionString, sql, param);
        }

        /// <summary>
        /// 获取数据库里所有的对照信息
        /// </summary>
        /// <returns>对照信息数组</returns>
        public ForeRealStationCompareEntity[] GetAllRecord(RealStationCompareType type)
        {
            List<object> ps = new List<object>() { "ForeRealStationCompareEntity_GetAllRecord", this._tableName, type };
            string cacheKey = getValideCacheKey(ps);
            object cache = CacheClient.Get(cacheKey);

            if (cache == null)
            {

                string sql = String.Format("SELECT * FROM [{0}] WHERE type='{1}'", _tableName, type.ToString());
                SqlConnection connection = new SqlConnection(_connectionString);
                SqlDataReader reader = DBHelper.ExecuteReader(connection, sql);
                List<ForeRealStationCompareEntity> result = new List<ForeRealStationCompareEntity>();
                while (reader.Read())
                {
                    ForeRealStationCompareEntity entity = new ForeRealStationCompareEntity();
                    entity.name = reader["name"].ToString();
                    entity.ForeStation = reader["fore"].ToString();
                    entity.RealStation = reader["real"].ToString();
                    result.Add(entity);
                }
                connection.Close();

                CacheClient.Set(cacheKey, result);

                return result.ToArray();
            }
            else
            {
                 List<ForeRealStationCompareEntity> result = cache as List<ForeRealStationCompareEntity> ;
                return result.ToArray();
            }
        }

        /// <summary>
        /// 获取所有预报站站号
        /// </summary>
        /// <returns>预报站站号数组</returns>
        public string[] GetAllForeStationIds(RealStationCompareType type)
        {
            string sql = String.Format("SELECT fore FROM [{0}] WHERE type='{1}'", _tableName,type.ToString());
            SqlConnection connection = new SqlConnection(_connectionString);
            SqlDataReader reader = DBHelper.ExecuteReader(connection, sql);
            List<string> result = new List<string>();
            while (reader.Read())
            {                
                result.Add(reader["fore"].ToString());
            }
            connection.Close();
            return result.ToArray();
        }       

        /// <summary>
        /// 获取所有实况站站号
        /// </summary>
        /// <returns>实况站站号数组</returns>
        public string[] GetAllRealStationIds(RealStationCompareType type)
        {
            string sql = String.Format("SELECT real FROM [{0}] WHERE type='{1}'", _tableName, type.ToString());
            SqlConnection connection = new SqlConnection(_connectionString);
            SqlDataReader reader = DBHelper.ExecuteReader(connection, sql);
            List<string> result = new List<string>();
            while (reader.Read())
            {
                result.Add(reader["real"].ToString());
            }
            connection.Close();
            return result.ToArray();
        }

        public Dictionary<string, string> GetForeRealStationCompare(RealStationCompareType type)
        {
            string sql = String.Format("SELECT real,fore FROM [{0}] WHERE type='{1}'", _tableName, type.ToString());
            SqlConnection connection = new SqlConnection(_connectionString);
            SqlDataReader reader = DBHelper.ExecuteReader(connection, sql);
            Dictionary<string, string> result = new Dictionary<string, string>();
            while (reader.Read())
            {
                result.Add(reader["fore"].ToString(), reader["real"].ToString());
            }
            connection.Close();
            return result;
        }
    }
}
